/*
 * @Author: 0x9DEFA478
 * @Date: 2021-09-20 16:59:48
 * @LastEditTime: 2022-04-01 16:43:16
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#include "IP_I2C.h"
#include "System/System.h"





static void MasterTransferRefresh(IP_I2C* ip_i2c,int IsISR){
  unsigned int RemainingSize;
  volatile unsigned int ISR;
  unsigned int CR2;
  
  ISR=cIP_I2C_I2C(ip_i2c)->ISR;

  RemainingSize=ip_i2c->TransStatus.TxRemainingSize;
  if(RemainingSize>0){
    //发送

    if(RemainingSize>255){

      ip_i2c->TransStatus.TxRemainingSize=RemainingSize-255;

      CR2=I2C_CR2_RELOAD
        |(255U<<I2C_CR2_NBYTES_Pos)
        |((ip_i2c->TransStatus.Address<<I2C_CR2_SADD_Pos)&I2C_CR2_SADD_Msk);

    }else{
      ip_i2c->TransStatus.TxRemainingSize=0;

      CR2=
      ((RemainingSize<<I2C_CR2_NBYTES_Pos)&I2C_CR2_NBYTES_Msk)
      |((ip_i2c->TransStatus.Address<<I2C_CR2_SADD_Pos)&I2C_CR2_SADD_Msk);
      
    }
    if(ip_i2c->TransStatus.TxIsStartTransfer==0){
      ip_i2c->TransStatus.TxIsStartTransfer=-1;
      cIP_I2C_I2C(ip_i2c)->CR2=CR2|I2C_CR2_START;
    }else{
      cIP_I2C_I2C(ip_i2c)->CR2=CR2;
    }

  }else{

    RemainingSize=ip_i2c->TransStatus.RxRemainingSize;
    if(RemainingSize>0){

      if(RemainingSize>255){
        ip_i2c->TransStatus.RxRemainingSize=RemainingSize-255;

        CR2=I2C_CR2_RELOAD
          |(255U<<I2C_CR2_NBYTES_Pos)
          |I2C_CR2_RD_WRN
          |((CR2<<I2C_CR2_SADD_Pos)&I2C_CR2_SADD_Msk);

      }else{
        ip_i2c->TransStatus.RxRemainingSize=0;

        CR2=
          ((RemainingSize<<I2C_CR2_NBYTES_Pos)&I2C_CR2_NBYTES_Msk)
          |I2C_CR2_RD_WRN
          |((ip_i2c->TransStatus.Address<<I2C_CR2_SADD_Pos)&I2C_CR2_SADD_Msk);

      }
      if(ip_i2c->TransStatus.RxIsStartTransfer==0){
        ip_i2c->TransStatus.RxIsStartTransfer=-1;
        cIP_I2C_I2C(ip_i2c)->CR2=CR2|I2C_CR2_START;
      }else{
        cIP_I2C_I2C(ip_i2c)->CR2=CR2;
      }

    }else{
      //结束传输

      cIP_I2C_I2C(ip_i2c)->CR2|=I2C_CR2_STOP;

      while((cIP_I2C_I2C(ip_i2c)->ISR&I2C_ISR_STOPF)!=I2C_ISR_STOPF){
      }
      cIP_I2C_I2C(ip_i2c)->ICR=I2C_ICR_STOPCF;

      ip_i2c->TransStatus.IsBusy=0;
      ip_i2c->DoneCallback(ip_i2c->v_DoneCallback,vIP_I2C_Error_None,IsISR);
    }
  }
  

}





/**
 * @brief 进行I2C传输 在空闲时调用
 * @param ip_i2c IP_I2C句柄
 * @param Address 地址  7位格式: [15:8]:0 [7:1]:7位地址 Bit0:不使用 
 *                     10位格式: [15:11]:11110 [10:9]:地址高两位 Bit8:不使用 [7:0]:地址低8位
 * @param TxData 发送数据, 如果无可为NULL
 * @param TxLength 发送数据长度
 * @param RxBuffer 接收缓存, 如果无可为NULL
 * @param RxLength 接收数据长度
 * @param DoneCallback 传输完成回调 传入v和[0:成功 其他:失败]
 * @param v 用于DoneCallback调用
 * @return 无
 */
void IP_I2C_OnlyMaster_Transfer(IP_I2C* ip_i2c,unsigned short Address,void* TxData,int TxLength,void* RxBuffer,int RxLength
  ,void (*DoneCallback)(void*,int,int),void* v){


  if((TxLength==0)&&(RxLength==0)){
    DoneCallback(v,vIP_I2C_Error_None,0);
    return;
  }
  if(ip_i2c->TransStatus.IsBusy!=0){
    DoneCallback(v,vIP_I2C_Error_Unknow,0);
    return;
  }

  ip_i2c->TransStatus.IsBusy=-1;

  if((cIP_I2C_I2C(ip_i2c)->CR1&I2C_CR1_PE)==0){
    cIP_I2C_I2C(ip_i2c)->CR1|=I2C_CR1_PE;//使能I2C
  }

  while(cIP_I2C_I2C(ip_i2c)->ISR&I2C_ISR_BUSY){
  }


  if((Address&0xF800U)!=0xF000U){
    Address&=0x00FEU;
  }

  ip_i2c->DoneCallback=DoneCallback;
  ip_i2c->v_DoneCallback=v;
  ip_i2c->TransStatus.TxRemainingSize=TxLength;
  ip_i2c->TransStatus.TxIsStartTransfer=0;
  ip_i2c->TransStatus.RxRemainingSize=RxLength;
  ip_i2c->TransStatus.RxIsStartTransfer=0;
  ip_i2c->TransStatus.Address=Address;

  System_CompileBarrier();

  cIP_I2C_txDMA(ip_i2c)->NDTR=(unsigned int)TxLength;
  cIP_I2C_txDMA(ip_i2c)->M0AR=(unsigned int)TxData;
  cIP_I2C_rxDMA(ip_i2c)->NDTR=(unsigned int)RxLength;
  cIP_I2C_rxDMA(ip_i2c)->M0AR=(unsigned int)RxBuffer;


  oIP_DMA_ClearAllBit_IFCR(ip_i2c->Instance.DMA_Tx);
  oIP_DMA_ClearAllBit_IFCR(ip_i2c->Instance.DMA_Rx);

  
  if(RxLength>0){
    cIP_I2C_rxDMA(ip_i2c)->CR|=DMA_SxCR_EN;//使能DMA
  }
  if(TxLength>0){
    cIP_I2C_txDMA(ip_i2c)->CR|=DMA_SxCR_EN;//使能DMA
  }

  MasterTransferRefresh(ip_i2c,0);

}




void IP_I2C_EVENT_IRQ_OnlyMaster(IP_I2C* ip_i2c){
  unsigned int ISR;
  
  ISR=cIP_I2C_I2C(ip_i2c)->ISR;
  if((ISR&I2C_ISR_NACKF)!=0){
    cIP_I2C_I2C(ip_i2c)->ICR=I2C_ICR_NACKCF;

    cIP_I2C_rxDMA(ip_i2c)->CR&=(~DMA_SxCR_EN);//失能DMA
    cIP_I2C_txDMA(ip_i2c)->CR&=(~DMA_SxCR_EN);//失能DMA

    cIP_I2C_I2C(ip_i2c)->CR1&=(~I2C_CR1_PE);//失能I2C

    ip_i2c->TransStatus.IsBusy=0;
    ip_i2c->DoneCallback(ip_i2c->v_DoneCallback,vIP_I2C_Error_NAK,-1);

    return;
  }

  if((ISR&(I2C_ISR_TC|I2C_ISR_TCR))!=0){
    if(ip_i2c->TransStatus.IsBusy!=0){
      MasterTransferRefresh(ip_i2c,-1);
    }
  }

}

void IP_I2C_ERROR_IRQ_OnlyMaster(IP_I2C* ip_i2c){
  unsigned int ISR;
  int Error;
  
  ISR=cIP_I2C_I2C(ip_i2c)->ISR;
  if(ip_i2c->TransStatus.IsBusy!=0){
    cIP_I2C_rxDMA(ip_i2c)->CR&=(~DMA_SxCR_EN);//失能DMA
    cIP_I2C_txDMA(ip_i2c)->CR&=(~DMA_SxCR_EN);//失能DMA

    cIP_I2C_I2C(ip_i2c)->CR1&=(~I2C_CR1_PE);//失能I2C

    if((ISR&I2C_ISR_BERR)!=0){
      Error=vIP_I2C_Error_BusError;
    }else if((ISR&I2C_ISR_ARLO)!=0){
      Error=vIP_I2C_Error_ArbitrationLost;
    }else if((ISR&I2C_ISR_OVR)!=0){
      Error=vIP_I2C_Error_Over;
    }else{
      Error=vIP_I2C_Error_Unknow;
    }
    ip_i2c->TransStatus.IsBusy=0;
    ip_i2c->DoneCallback(ip_i2c->v_DoneCallback,Error,-1);
  }

}



